Set GDK_WINDOW_STATE_TILED if any edge is tiled
authorSimon McVittie <smcv@debian.org>
Thu, 26 Oct 2017 14:51:51 +0000 (15:51 +0100)
committerTimm Bäder <mail@baedert.org>
Sat, 20 Jan 2018 12:10:49 +0000 (13:10 +0100)
This state flag is used in several places in GTK+, for example to
ignore RESIZE_INC hints if tiled. Setting it is also necessary for
backwards compatibility with applications that changed their behaviour
when tiled, such as GNOME Terminal and its MATE fork.

Signed-off-by: Simon McVittie <smcv@debian.org>
https://bugzilla.gnome.org/show_bug.cgi?id=789357

gdk/wayland/gdkwindow-wayland.c
gdk/x11/gdkdisplay-x11.c

index f5611f09db4afe324ea7b12d974e440d7ffb46b9..3f9db70882799454bb3618d04ec71b956aa82bbf 100644 (file)
@@ -2890,16 +2890,16 @@ gtk_surface_configure (void                *data,
 
         /* Since v2 */
         case GTK_SURFACE1_STATE_TILED_TOP:
-          new_state |= GDK_WINDOW_STATE_TOP_TILED;
+          new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_TOP_TILED);
           break;
         case GTK_SURFACE1_STATE_TILED_RIGHT:
-          new_state |= GDK_WINDOW_STATE_RIGHT_TILED;
+          new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_RIGHT_TILED);
           break;
         case GTK_SURFACE1_STATE_TILED_BOTTOM:
-          new_state |= GDK_WINDOW_STATE_BOTTOM_TILED;
+          new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_BOTTOM_TILED);
           break;
         case GTK_SURFACE1_STATE_TILED_LEFT:
-          new_state |= GDK_WINDOW_STATE_LEFT_TILED;
+          new_state |= (GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_LEFT_TILED);
           break;
         default:
           /* Unknown state */
index 84a1b2f1ae4bc40b6611442ca963334104795a85..67a7217b4f33e760325284801cdbc01bafc50501 100644 (file)
@@ -199,6 +199,11 @@ gdk_x11_display_event_translator_init (GdkEventTranslatorIface *iface)
   iface->translate_event = gdk_x11_display_translate_event;
 }
 
+#define ANY_EDGE_TILED (GDK_WINDOW_STATE_LEFT_TILED | \
+                        GDK_WINDOW_STATE_RIGHT_TILED | \
+                        GDK_WINDOW_STATE_TOP_TILED | \
+                        GDK_WINDOW_STATE_BOTTOM_TILED)
+
 static void
 do_edge_constraint_state_check (GdkWindow      *window,
                                 GdkWindowState  old_state,
@@ -214,8 +219,9 @@ do_edge_constraint_state_check (GdkWindow      *window,
   edge_constraints = toplevel->edge_constraints;
 
   /* If the WM doesn't support _GTK_EDGE_CONSTRAINTS, rely on the fallback
-   * implementation. If it supports _GTK_EDGE_CONSTRAINTS, however, remove
-   * the GDK_WINDOW_STATE_TILED flag explicitly.
+   * implementation. If it supports _GTK_EDGE_CONSTRAINTS, arrange for
+   * GDK_WINDOW_STATE_TILED to be set if any edge is tiled, and cleared
+   * if no edge is tiled.
    */
   if (!gdk_window_supports_edge_constraints (window))
     {
@@ -237,7 +243,15 @@ do_edge_constraint_state_check (GdkWindow      *window,
   else
     {
       if (old_state & GDK_WINDOW_STATE_TILED)
-        local_unset |= GDK_WINDOW_STATE_TILED;
+        {
+          if (!(edge_constraints & ANY_EDGE_TILED))
+            local_unset |= GDK_WINDOW_STATE_TILED;
+        }
+      else
+        {
+          if (edge_constraints & ANY_EDGE_TILED)
+            local_set |= GDK_WINDOW_STATE_TILED;
+        }
     }
 
   /* Top edge */